package com.woniuxy;

import com.woniuxy.entity.utils.ResponseEntity;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @Author: 马宇航
 * @Do: 切面类，
 * @DateTime: 22/06/24/0024 上午 11:55
 * @Component: 成都蜗牛学苑
 **/
@Aspect
@Component
public class AspectObject {
    @Pointcut("execution(* com.woniuxy.service.impl.*.*(..))")
    public void  myPointCut(){}
    int times = 0;
    // 环绕通知
    @Around("myPointCut()")
    public Object myAround(ProceedingJoinPoint proceedingJoinPoint)
            throws Throwable {
        int i = Count.atomicInteger.get();//失败次数统计
        //如果OpenFeign调用product服务，出现异常的线程超过10次
        if (i>= 10 && ++times%10 != 0) { //每10次去尝试获取服务信息，如果能够成功获取，则不要快速失败
            //不要走OpenFeign的接口了，直接快速失败。
            System.out.println("失败次数操作了" + i + "次，我们就是直接返回不用去走正常方法。");
            return ResponseEntity.ERROR;
        }
        // 开始
        System.out.println("环绕开始：执行目标方法之前，模拟开启事务...");
        // 执行当前目标方法
        Object obj = proceedingJoinPoint.proceed();
        System.out.println(obj.getClass().getName());
        //写这里表示，上面的方法执行未进全局异常
        Count.atomicInteger.set(0);
        // 结束
        System.out.println("环绕结束：执行目标方法之后，模拟关闭事务...");
        return obj;
    }

}
